{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# TypeError：'list'对象在python中不可调用\n",
    "\n",
    "错误场景，在学习[《001-Python 基本的数据类型》]()的`dict`的时候\n",
    "\n",
    "因为上面一行代码已经定义了\n",
    "\n",
    "## 错误重现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "ename": "TypeError",
     "evalue": "'dict' object is not callable",
     "output_type": "error",
     "traceback": [
      "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
      "\u001b[0;32m<ipython-input-1-948fb9696e99>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m      1\u001b[0m \u001b[0mdict\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m{\u001b[0m\u001b[0;34m}\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m      2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 3\u001b[0;31m \u001b[0mdict\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'Runoob'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'Google'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m2\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0;34m'Taobao'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
      "\u001b[0;31mTypeError\u001b[0m: 'dict' object is not callable"
     ]
    }
   ],
   "source": [
    "dict = {}\n",
    "\n",
    "dict([('Runoob', 1), ('Google', 2), ('Taobao', 3)])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 解读\n",
    "\n",
    "我相信这是相当明显的。python将对象名(函数和类也是对象)存储在字典(名称空间作为字典实现)中，因此您可以在任何范围内重写几乎任何名称。它不会以某种错误的形式出现。正如您可能知道的那样，python强调\"特殊情况不足以打破规则\"。你所面临的问题背后有两条主要规则。\n",
    "\n",
    "## 命名空间\n",
    "python支持嵌套的名称空间。理论上，您可以无限嵌套名称空间。正如我已经提到的，名称空间基本上是名称和对相应对象的引用的字典。您创建的任何模块都会得到自己的\"全局\"名称空间。实际上，它只是一个特定模块的本地名称空间。\n",
    "\n",
    "## 范围\n",
    "引用名称时，python运行时会在本地命名空间中查找该名称(相对于引用而言)，如果不存在该名称，则会在更高级别的命名空间中重复尝试。此过程将继续，直到没有更高的命名空间。在这种情况下，你会得到一个NameError。内置函数和类驻留在一个特殊的高阶命名空间__builtins__中。如果在模块的全局命名空间中声明一个名为list的变量，则解释器将永远不会在更高级别的命名空间(即__builtins__中)中搜索该名称。同样，假设您在模块中的函数内创建一个变量var，在模块中创建另一个变量var。然后，如果在函数内部引用var，则永远不会得到全局var，因为本地命名空间中有一个var-解释器不需要在其他地方搜索它。\n",
    "\n",
    "最佳参考：https://www.codenong.com/31087111/\n",
    "\n",
    "# 解决"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'Runoob': 1, 'Google': 2, 'Taobao': 3}"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "del dict \n",
    "\n",
    "dict([('Runoob', 1), ('Google', 2), ('Taobao', 3)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
